iT邦幫忙

2023 iThome 鐵人賽

DAY 7
1
DevOps

第一次參賽就學 Kubernetes系列 第 7

[Day 07] Pods

  • 分享至 

  • xImage
  •  

Pods

假設今天想將應用服務部署在 k8s 叢集,第一步就是要為應用服務建立一個 image,再將它放在本地或 Docker Registry (如: DockerHub) 上。在叢集中,應用程式是以容器的形式部屬在一台或一組機器 (worker node) 上運行。因此,若要在叢集中執行程式必須先把他打包成容器的形式來作業。

第二步是叢集會從儲存庫中拉下應用程式的 image ,並建立容器把它封裝在 pod 中,一個 pod 就好比是一個應用程式的實例,也是 k8s 中的最小基本單位。

以 Pod 的形式來執行應用程式

  • scale up and down 具擴充性,當使用人數變多時,可以直接新增一個 pod 平衡負載。這樣的方式也讓程式保有架構修改與擴展的彈性。而當機器的實體空間不足時,可以在新的 node 上建立 pod。
  • 容易維護應用程式間的關聯性。一個 pod 中有多個互相連結的容器時,容器共享同個 pod 提供的資源(網路、存儲資源或生命週期),使容器可以一起啟動和停止,便於管理,不需要額外維護之間程式間的對應關係。

Pod 與容器

通常來說一個 pod 中會放一個容器,一個 pod 中也可以有多個容器。例如:一個 pod 存在 node.js app 容器跟提供 app 資料的容器。

一個 Pod 放多個容器

例如一個容器是執行 web server、另一個容器(helper containers)提供 server 所需資料,彼此可以共享網路和儲存空間。

實際操作

以下是跑一個 nginx 的範例。

  1. 一般來說會建立一個 YAML 格式的設定檔來建立 pod。

    nginx.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
    

    說明:

    • apiVersion:版本號,pod 是 v1。
    • kind:資源的類型,當前是 pod。
    • metedata:描述 pod 名稱、有哪些 label(之後會提到)。
    • spec:告訴 k8s 定義物件裡的內容。

    常用的 kind 與 apiVersion 的對應如下:

    kind apiVersion

    Pod | v1 |
    ReplicationController | v1 |
    ReplicaSet | apps/v1 |
    Deployment | apps/v1 |
    Service | v1 |

  2. 使用 kubectl 命令來部署 pod

    kubectl apply -f nginx.yaml
    pod/nginx created
    

    若沒有設定檔時也可以由 repository(DockerHub) 或私有的 repository 拉一個現有的 image 下來。(前提是你拉的那個是存在 Docker Hub 上)

    kubectl run nginx --image=nginx
    

    使用以下指令可以印出 yaml 格式的設定檔

    kubectl get pod nginx -o yaml
    

    建議是用 YAML 設定檔來建立 pod ,一來可以重複使用、二來有檔案可以方便閱讀與維護。

    當部署後我們可以用以下指令來取得 pod 資訊:

    • kubectl get pods:列出當前從叢中的 pods
    • kubectl describe pods <pod-name>:列出 pod 的詳細資訊
    • kubectl logs <pod-name>:印出 pod 中容器的 logs
    • kubectl exec <pod-name> [flags]:在容器中下指令
  3. 檢查 pod 狀態

    kubectl get pods
    
    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          35s
    
  4. 列出 pod 的詳細資訊

    kubectl describe pods nginx
    

    包含 pod 的名稱、哪個 node、有哪些 label 以及容器使用的 image

    Name:             nginx
    Namespace:        default
    Priority:         0
    Service Account:  default
    Node:             minikube/192.168.49.2
    Start Time:       Fri, 22 Sep 2023 22:11:16 +0800
    Labels:           run=nginx
    Annotations:      <none>
    Status:           Running
    IP:               10.244.0.4
    IPs:
      IP:  10.244.0.4
    Containers:
      nginx:
        Container ID:   docker://1c5b534c8013dfd6779be7d0af445bc3a465edc803040411f5c34f4a862f37af
        Image:          nginx
        Image ID:       docker-pullable://nginx@sha256:32da30332506740a2f7c34d5dc70467b7f14ec67d912703568daff790ab3f755
        Port:           <none>
        Host Port:      <none>
        State:          Running
          Started:      Fri, 22 Sep 2023 22:11:21 +0800
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-8tql6 (ro)
    Conditions:
      Type              Status
      Initialized       True
      Ready             True
      ContainersReady   True
      PodScheduled      True
    Volumes:
      kube-api-access-8tql6:
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  3607
        ConfigMapName:           kube-root-ca.crt
        ConfigMapOptional:       <nil>
        DownwardAPI:             true
    QoS Class:                   BestEffort
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type    Reason     Age   From               Message
      ----    ------     ----  ----               -------
      Normal  Scheduled  90s   default-scheduler  Successfully assigned default/nginx to minikube
      Normal  Pulling    89s   kubelet            Pulling image "nginx"
      Normal  Pulled     85s   kubelet            Successfully pulled image "nginx" in 3.753411808s (3.753422938s including waiting)
      Normal  Created    85s   kubelet            Created container nginx
      Normal  Started    85s   kubelet            Started container nginx
    
  5. 進入容器並使用 bash

    kubectl exec -it nginx -- bash
    

    列出容器當前目錄下檔案

    root@nginx:/# ls
    bin   dev		   docker-entrypoint.sh  home  lib32  libx32  mnt  proc  run   srv  tmp  var
    boot  docker-entrypoint.d  etc			 lib   lib64  media   opt  root  sbin  sys  usr
    
  6. 刪除 pod

    kubectl delete po nginx
    pod "nginx" deleted
    

    查看當前叢集的 pods

    kubectl get po
    No resources found in default namespace.
    

參考資源

  1. Kubernetes - Viewing Pods and Nodes

上一篇
[Day 06] kubeadm 建置環境 (下篇)
下一篇
[Day 08] YAML 設定檔
系列文
第一次參賽就學 Kubernetes30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言